package com.ys.instanceofs;

/**
 * 描述: instanceof 二元运算符:
 * 语法 obj instanceof clss
 * 注意事项：
 * a)obj可以是一个对象，也可以为null。
 * b)class可以是一个类，也可以是一个接口。
 * c)instanceof二元运算符返回的结果是一个boolean类型。
 * 3.什么是编译时类型呢？什么是运行时类型呢？
 * Animal animal = new Tiger();
 * 编译时类型      运行时类型
 * 4.instanceof二元运算符编译时的特点
 * a)当obj为null的情况
 * 当左边obj为null，则右边的“类或接口”可以是任意类型。
 * b)当obj不是null的情况
 * --> 注意：此处的“本身类”指的就是“编译时类型”。
 * 5.instanceof二元运算符运行时的特点
 * 当右边“类或接口”是左边“对象”的父类、本身类和子类时，编译通过，否则编译失败。
 * a)当obj为null的情况
 * 当obj为null，则返回的结果肯定是false。
 * b)当obj不是null的情况
 * 当右边“类或接口”是左边“对象”的父类和本身类，返回结果就是true；
 * 当右边“类或接口”是左边“对象”的子类和兄弟类，返回结果就是false。
 * --> 注意：此处的“本身类”指的就是“运行时类型”。
 *
 * @author CodeYang
 * @version 2020/12/16 17:48
 */
public class checkClassCastException {

    public static void main(String[] args) {
        //instanceof 一般用来 向下转型过程中,赖判断 对象的类型 是否符合向下转型的对象,避免 类型转换错误
        // 向上转型:
        Person obj = new Son01();
        //编译时                            // 运行时
        //编译时: 本身类父类                // 运行时:本身类父类
        System.out.println(obj instanceof Object); // true
        //编译时: 本身类                // 运行时:本身类父类
        System.out.println(obj instanceof Person); //true
        //编译时: 本身类的子类                // 运行时:本身类
        System.out.println(obj instanceof Son01); //true
        //编译时: 本身类的子类                // 运行时:本身类兄弟类
        System.out.println(obj instanceof Son02); //false
        //编译时: 本身类的子类                // 运行时:本身类兄的子类
        System.out.println(obj instanceof Son01_Son); //false

        // 当 obj = instanceof clas 中 obj为null ,右边为(引用数据)任何类型都会编译通过,并且返回false
        boolean ck = null instanceof int[];
        System.out.println(ck); // false
        /**
         * 向上转型：父类引用指向子类对象，属于自动类型转换。
         * 	格式：父类类型 变量名 =  子类对象;
         * 向下转型：子类引用指向父类对象，属于强制类型转换。
         * 	格式：子类类型 变量名 =  (子类类型) 父类对象;
         */
        //向下转型: --强制转换
        //  Son01 son01 = (Son01) new Person();

        if (obj instanceof Son01) {
            System.out.println("obj是Son01的实列");
            Son01 son01 = (Son01) new Person();
        }
        if (obj instanceof Son02) {
            System.out.println("obj是Son02的实列");
            Son02 son01 = (Son02) new Person();
        }

    }


}
